/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package familytree.persistencia.dao.hibernate;

import familytree.persistencia.dao.UsuarioDAO;
import familytree.persistencia.pojos.Arbol;
import familytree.persistencia.pojos.Nodo;
import familytree.persistencia.pojos.Usuario;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Antonio
 */
public class HibernateUsuarioDAO extends HibernateGenericDAO<Usuario, String>
        implements UsuarioDAO {

    public List<Usuario> getUsuarioByMailAndPass(String correo, String pass) {

        //Se abre la transacción

        List<Usuario> usuarios = new ArrayList<Usuario>();

        Transaction tx = getSession().beginTransaction();
        try {
            //Debe coincidir en correo y contraseña
            Criterion criterion = Restrictions.eq("correo", correo);
            Criterion criterion2 = Restrictions.eq("contrasena", pass);
            usuarios = findByCriteria(criterion, criterion2);

        } catch (HibernateException he) {
        }
        
        
        

        return usuarios;
    }

    public List<Usuario> getUsuarioByMail(String correo) {

        List<Usuario> usuarios = new ArrayList<Usuario>();
        //Se inicia la transacción
        Transaction tx = getSession().beginTransaction();
        try {
            Criterion criterion = Restrictions.eq("correo", correo);
            usuarios = findByCriteria(criterion);
            tx.commit();
        } catch (HibernateException he) {
            tx.rollback();
        }
        return usuarios;
    }

    /**
    Devuelve los usuarios que tienen esa misma dirección de correo en la familia
     */
    public List<Usuario> getUsuarioByMailAndFamily(String correo, Arbol arbol) {
        List<Usuario> usuarios = new ArrayList<Usuario>();

        String queryString = "SELECT u.* FROM usuario u INNER JOIN nodo n ON u.idUsuario = n.idUsuario ";
        queryString += " WHERE u.correo = :correo AND n.idArbol = :idArbol";

        Transaction tx = getSession().beginTransaction();
        try {
            SQLQuery query = getSession().createSQLQuery(queryString);
            query.addEntity(Usuario.class);
            query.setString("correo", correo);
            query.setString("idArbol", arbol.getIdArbol());
            usuarios = query.list();
            tx.commit();
        }
        catch(HibernateException he){
            tx.rollback();
        }
        
        return usuarios;
    }
    
    public Usuario insert (Usuario usuario,Nodo nodo){
    
       
        Transaction tx = getSession().beginTransaction();
        try{
            Nodo node = (Nodo)getSession().load(Nodo.class, nodo.getIdNodo(), LockMode.UPGRADE);
            usuario = makePersistent(usuario);
            node.setUsuario(usuario);
            usuario.setNodo(node);
            tx.commit(); 
        }
        catch(HibernateException he){
            tx.rollback();
        }
        return usuario;
    }
}
